<#noparse>#FROM ccr.ccs.tencentyun.com/library/ubuntu:22.04
#FROM dockerproxy.com/library/openjdk:11-jdk-slim
FROM openjdk:11-jdk-slim

# -----------------------------------------------------------------------------
# 设置容器默认时区为上海，保证容器内时间一致性
# -----------------------------------------------------------------------------
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# -----------------------------------------------------------------------------
# 定义构建期参数（build arguments），均为【必填】参数
# APP_NAME，应用名称，【必须】，来源于部署时指定的应用名称。
# APP_VERSION，应用版本，【必须】，来源于部署时指定的应用版本。
# IMAGE_CREATE_TIME，镜像创建时间，【必须】，来源于ARG参数传递，格式必须是 【yyyyMMddHHmmss】。
# IMAGE_OWNER，镜像创建者，【必须】，来源于CI系统，或者镜像制作人。
# JAR_FILE， 文件名称，【必须】,例如 my-service-1.0.0.jar
# -----------------------------------------------------------------------------
ARG APP_NAME
ARG APP_VERSION
ARG IMAGE_CREATE_TIME
ARG IMAGE_OWNER
ARG JAR_FILE

# -----------------------------------------------------------------------------
# 校验 1：判断构建参数是否都已传入（不能为空）
# 若任一参数未定义或为空，则输出错误信息并退出，退出码为 1
# -----------------------------------------------------------------------------
RUN echo ">>> 校验构建参数是否非空 ..." && \
    echo "APP_NAME         = ${APP_NAME}" && \
    echo "APP_VERSION      = ${APP_VERSION}" && \
    echo "IMAGE_CREATE_TIME= ${IMAGE_CREATE_TIME}" && \
    echo "IMAGE_OWNER      = ${IMAGE_OWNER}" && \
    echo "JAR_FILE         = ${JAR_FILE}" && \
    test -n "${APP_NAME}" \
     && test -n "${APP_VERSION}" \
     && test -n "${IMAGE_CREATE_TIME}" \
     && test -n "${IMAGE_OWNER}" \
     && test -n "${JAR_FILE}" \
     || (echo "[ERROR][ExitCode=1] 缺少必需的构建参数！请确认 APP_NAME / APP_VERSION / IMAGE_CREATE_TIME / IMAGE_OWNER / JAR_FILE 已设置。" && exit 1)

# -----------------------------------------------------------------------------
# 校验 2：IMAGE_CREATE_TIME 的格式是否符合要求（yyyyMMddHHmmss）
# 若格式非法，退出码为 2
# -----------------------------------------------------------------------------
RUN echo ">>> 校验 IMAGE_CREATE_TIME 格式 ..." && \
    echo "${IMAGE_CREATE_TIME}" | grep -Eq '^[0-9]{14}$' \
     || (echo "[ERROR][ExitCode=2] IMAGE_CREATE_TIME 格式非法，必须是 'yyyyMMddHHmmss' 格式，例如 20250609123456，实际为 '${IMAGE_CREATE_TIME}'" && exit 2)

# -----------------------------------------------------------------------------
# 输出构建参数信息，方便构建日志中展示，便于排查问题
# -----------------------------------------------------------------------------
RUN echo "===================================================" && \
    echo ">>> Docker 镜像构建参数:" && \
    echo ">>> APP_NAME         = ${APP_NAME}" && \
    echo ">>> APP_VERSION      = ${APP_VERSION}" && \
    echo ">>> IMAGE_CREATE_TIME= ${IMAGE_CREATE_TIME}" && \
    echo ">>> IMAGE_OWNER      = ${IMAGE_OWNER}" && \
    echo ">>> JAR_FILE         = ${JAR_FILE}" && \
    echo "==================================================="

# -----------------------------------------------------------------------------
# 为镜像打上 LABEL 标签，便于仓库管理、镜像筛选与元数据追踪
# 注意：这里使用展开后的 ARG 值，确保写入的是实际值，而非变量名
# -----------------------------------------------------------------------------
LABEL app.name="${APP_NAME}" \
      app.version="${APP_VERSION}" \
      image.create_time="${IMAGE_CREATE_TIME}" \
      image.owner="${IMAGE_OWNER}"

# -----------------------------------------------------------------------------
# 设置容器运行时的环境变量（ENV 变量可在 entrypoint.sh 或容器内部引用）
# -----------------------------------------------------------------------------
ENV APP_NAME=${APP_NAME} \
    APP_VERSION=${APP_VERSION} \
    LOG_ROOT=/app/logs

# -----------------------------------------------------------------------------
# 安装容器运行所需的依赖（OpenJDK 11 + 常用工具），无推荐包，保持精简
# -----------------------------------------------------------------------------
# 安装必要工具 + tzdata（用于时区设置）
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        tzdata \
        bash \
        curl \
        wget \
        openssh-client && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# -----------------------------------------------------------------------------
# 设置工作目录为 /app，Jar 包和脚本都将位于此目录
# -----------------------------------------------------------------------------
WORKDIR /app

# -----------------------------------------------------------------------------
# 拷贝 Jar 包并重命名为标准入口 app.jar
# 注意：COPY 指令中不能使用变量展开，因此 ${JAR_FILE} 必须传入明确的文件名
# -----------------------------------------------------------------------------
COPY ${JAR_FILE} /app/app.jar

# -----------------------------------------------------------------------------
# 拷贝启动脚本，并赋予可执行权限
# entrypoint.sh 应当由你在上下文中提供，负责执行 java 命令
# -----------------------------------------------------------------------------
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# -----------------------------------------------------------------------------
# 显式暴露服务端口 8080（默认 Spring Boot 应用端口）
# -----------------------------------------------------------------------------
EXPOSE 8080

# -----------------------------------------------------------------------------
# 指定容器启动入口点为 entrypoint.sh 脚本
# -----------------------------------------------------------------------------
ENTRYPOINT ["/entrypoint.sh"]

</#noparse>